import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:qr_code_app/common/service/log_module_data.dart';
import 'package:qr_code_app/common/util/util.dart';
import 'package:qr_code_app/module/diary/bloc/log_state.dart';
import 'package:qr_code_app/module/diary/entity/log_entity.dart';
import 'package:todo_flutter/todo_flutter.dart';

part 'log_event.dart';

class LogBloc extends BaseBloc<LogEvent, LogState> {
  LogBloc() : super(LogInitState());

  late DataChangeBloc<List<LogEntity>> postListBloc = DataChangeBloc([]);

  init() {
    postListBloc.changeData(getPosts());
  }

  refresh() {
    postListBloc.changeData(getPosts());
  }

  List<LogEntity> getPosts() {
    // 获取之前保存的帖子列表的字符串形式
    List<String>? postsString = PreferencesUtil.getStringList(kLog);

    // 如果之前没有保存过帖子，则返回空列表
    if (postsString == null || postsString.isEmpty) {
      return [];
    }

    // 将每个帖子字符串解析为帖子对象
    List<LogEntity> posts = postsString
        .map((postString) => LogEntity.fromJson(jsonDecode(postString)))
        .toList();

    // 对帖子列表进行倒序排列
    posts.sort((a, b) => (b.timestamp ?? '').compareTo(a.timestamp ?? ''));

    return posts;
  }

  addPost(File imageFile, String content) async {
    // 获取当前时间戳并转换为字符串形式
    String timestamp = DateTime.now().toIso8601String();

    // 将图片文件转换为字符串
    Uint8List imageBytes = Util().fileToU8(imageFile);
    String imageString = Util().u8ToString(imageBytes);

    // 构造帖子对象
    LogEntity post = LogEntity()
      ..image = imageString
      ..content = content
      ..timestamp = timestamp; // 添加时间戳

    // 获取之前保存的帖子列表
    List<LogEntity>? posts = getPosts();

    // 如果之前没有保存过帖子，则创建一个新的列表
    posts ??= [];

    // 将新的帖子添加到列表中
    posts.insert(0, post);

    // 保存帖子列表到本地
    setPosts(posts);
  }

  void setPosts(List<LogEntity> posts) {
    // 将帖子对象转换为字符串形式
    List<String> postsString =
        posts.map((post) => jsonEncode(post.toJson())).toList();

    // 保存帖子列表到本地
    PreferencesUtil.putStringList(kLog, postsString);
  }
}
